from django.contrib.auth import authenticate
from django.shortcuts import render
from django.views import View
from django_redis import get_redis_connection
from django.http import HttpResponse
from meiduo_mall.libs.captcha.captcha import captcha

from django.http import JsonResponse
import logging, random
logger = logging.getLogger('django')
from meiduo_mall.libs.yuntongxun.ccp_sms import CCP
from celery_tasks.sms.tasks import send_sms_code



class ImageCodeView(View):

    def get(self, request, uuid):
        '''生成图形验证码,保存后返回'''
        # 1.调用captcha框架,生成图片和对应的信息
        text, image = captcha.generate_captcha()

        # 2.链接redis, 获取redis的链接对象
        redis_conn = get_redis_connection('verify_code')

        # 3.调用链接对象, 把数据保存到redis
        redis_conn.setex('img_%s' % uuid, 300, text)

        # 4.返回图片给前端
        return HttpResponse(image,content_type='image/jpg')

class SMSCodeView(View):
    def get(self,request,mobile):
        '''接收参数，检验，发送短信验证码'''
        # 额外增加的功能:避免频繁发送短信验证码
        redis_conn = get_redis_connection('verify_code')

        flag = redis_conn.get('flag_%s'% mobile)

        # 0.从redis中获取60s保存的信息
        # 0.1判断该值是否存在，如果不存在，进行下面的步骤， 如果存在，返回
        if flag:
            return JsonResponse({'code': 400, "errmsg": '请不要频繁发送'})

        # 1.接受查询字符串参数
        image_code_cilent = request.GET.get('image_code')
        uuid = request.GET.get('image_code_id')

        # 2.总体检验
        if not all([image_code_cilent,uuid]):
            return JsonResponse({'code':400,'errmsg':'缺少必要参数'})

        # 3.链接redis，获取redis的链接对象

        # 4.从redis中取出图形验证码
        redis_code_server = redis_conn.get('img_%s' % uuid)

        # 5.判断服务端的图形验证码是否过期，如果过期，return
        if redis_code_server is None:
            return JsonResponse({'code':400,'errmsg':'图形验证码失效'})

        # 6.删除redis中图形验证码
        try:
            redis_conn.delete('img_%s' % uuid)
        except Exception as e:
            logging.info(e)

        # 7.对比前端后端的图形验证码
        if image_code_cilent.lower() != redis_code_server.decode().lower():
            return JsonResponse({'code':400,'errmsg':'图形验证码错误'})

        # 8.随机生成6位数的短信验证码
        sms_code = '%06d' % random.randint(0,999999)

        # 9.打印短信验证码
        # logging.info(sms_code)
        print(sms_code)
        # 10.把短信验证码保存到redis

        # redis_conn.setex('sms_%s' % mobile,300,sms_code)
        # # 我们给写入的数据设置为60s,如果过期,则会获取不到.
        # redis_conn.setex('flag_%s' % mobile, 60, 1)

        # 管道执行
        p1 = redis_conn.pipeline()
        p1.setex('sms_%s' % mobile,300,sms_code)
        p1.setex('flag_%s' % mobile, 60, 1)
        p1.execute()
        # 11.调用容联云，发送短信验证码
        # CCP().send_template_sms(mobile, [sms_code, 5], 1)
        send_sms_code.delay(mobile, sms_code)
        # 12.返回json


        return JsonResponse({'code': 0,'errmsg': 'ok'})


































